package com.ilxqx.framework.system.enumeration;

import com.google.common.collect.Lists;
import com.ilxqx.framework.system.po.ItemEntry;
import org.apache.commons.lang3.StringUtils;

import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

/**
 * 定义规范实体枚举类
 * @author venus
 */
public interface EntityEnum {

	/**
	 * 获取枚举值
	 * @return 枚举值
	 */
	String getValue();

	/**
	 * 获取枚举值的含义
	 * @return 枚举值含义
	 */
	String getMeaning();

	/**
	 * 获取指定值枚举项
	 * @param cls 枚举类
	 * @param value 枚举值
	 * @return 枚举项
	 */
	static<T extends EntityEnum> T getEnum(Class<T> cls, String value) {
		if (cls.isEnum()) {
			T[] constants = cls.getEnumConstants();
			for (T constant : constants) {
				if (StringUtils.equalsIgnoreCase(constant.getValue(), value)) {
					return constant;
				}
			}
		}
		// 找不到或者不是枚举类，则返回null
		return null;
	}

	/**
	 * 获取所有的枚举项
	 * @param cls 枚举类
	 * @return 所有枚举项
	 */
	static List<ItemEntry> getEnums(Class<?> cls) {
		if (cls.isEnum() && EntityEnum.class.isAssignableFrom(cls)) {
			Object[] constants = cls.getEnumConstants();
			return Arrays.stream(constants)
				.map(constant -> {
					EntityEnum enumConstant = (EntityEnum) constant;
					return ItemEntry.of(enumConstant.getValue(), enumConstant.getMeaning());
				})
				.collect(Collectors.toList());
		}
		return Lists.newArrayList();
	}

}
